package controllers

import (
	"net/http"

	response "yuanaiproblem/models"
	"yuanaiproblem/models/dto"
	"yuanaiproblem/services"
	jwt "yuanaiproblem/utils"

	"github.com/gin-gonic/gin"
)

// Login 用户登录
// 入参：用户名、密码；返回：JWT令牌、用户信息或错误
// 流程：验证参数 -> 验证用户身份 -> 生成JWT令牌 -> 构造并返回响应
func Login(c *gin.Context) {
	// 初始化登录请求参数
	var req dto.LoginRequest
	// 绑定并校验请求参数，若失败返回错误信息
	if err := c.ShouldBind(&req); err != nil {
		response.Error(c, http.StatusBadRequest, "参数错误: "+err.Error())
		return
	}
	// 调用服务层验证用户身份
	user, err := services.AuthenticateUser(req.Username, req.Password)
	if err != nil {
		response.Error(c, http.StatusUnauthorized, "用户名或密码错误")
		return
	}
	// 生成JWT令牌
	token, err := jwt.GenerateToken(user.ID, user.Username)
	if err != nil {
		response.Error(c, http.StatusInternalServerError, "生成令牌失败")
		return
	}
	// 构造登录响应数据
	data := dto.LoginResponse{
		Token:     token,
		TokenType: "Bearer",
		ExpiresIn: 3600,
		UserID:    int64(user.ID),
		Username:  user.Username,
		Role:      user.Role,
	}
	// 返回成功响应
	response.Success(c, data, "登录成功")
}

// Register 用户注册
// 入参：用户名、密码；返回：创建的用户信息或错误
// 流程：验证参数 -> 检查用户名唯一性 -> 加密密码 -> 创建用户
func Register(c *gin.Context) {
	// 初始化注册请求参数结构体
	var req dto.RegisterRequest
	// 绑定并校验请求参数
	if err := c.ShouldBind(&req); err != nil {
		response.Error(c, http.StatusBadRequest, "参数错误: "+err.Error())
		return
	}
	// 调用服务层处理注册业务
	newUser, err := services.Register(req.Username, req.Password)
	if err != nil {
		// 按错误类型返回对应响应
		switch err.Error() {
		case "用户名已存在":
			response.Error(c, http.StatusConflict, err.Error())
		case "用户名长度必须为3-50位", "密码长度不能少于6位":
			response.Error(c, http.StatusBadRequest, err.Error())
		default:
			response.Error(c, http.StatusInternalServerError, "注册失败: "+err.Error())
		}
		return
	}
	// 构造注册响应数据
	data := dto.RegisterResponse{
		ID:        newUser.ID,
		Username:  newUser.Username,
		Role:      newUser.Role,
		CreatedAt: newUser.CreatedAt.Format("2006-01-02 15:04:05"),
	}
	// 构造并返回成功响应
	response.Success(c, data, "注册成功")
}
